package utils

import (
	"bufio"
	"io/ioutil"
	"os"
	"strconv"
	"strings"
)

// 文件是否存在
func GBFileIsExist(filePath string) bool {
	_, err := os.Stat(filePath)
	return err == nil || os.IsExist(err)
}

// 将 int64 值写入文件
func GBFileWriteInt64(filePath string, value int64) error {
	str := strconv.FormatInt(value, 10)
	return GBFileWriteString(filePath, str)
}

// 将 string 值写入文件
func GBFileWriteString(filePath string, str string) error {
	raw := []byte(str)
	return ioutil.WriteFile(filePath, raw, 0644)
}

// 读取文件内容，并转换为 int64
func GBFileReadAsInt64(filePath string) (int64, error) {
	str, err := GBFileReadAsTrimString(filePath)
	if err != nil {
		return 0, err
	}
	return strconv.ParseInt(str, 10, 64)
}

// 读取文件内容作为字符串，并且修剪
func GBFileReadAsTrimString(filePath string) (string, error) {
	str, err := GBFileReadAsString(filePath)
	if err != nil {
		return "", err
	}
	return strings.TrimSpace(str), nil
}

// 读取文件内容作为字符串
func GBFileReadAsString(filePath string) (string, error) {
	bytes, err := ioutil.ReadFile(filePath)
	if err != nil {
		return "", err
	}
	return string(bytes), nil
}

// 读取文件内容，按行拆分为 string 数组
func GBFileReadAndSplitLineAsStringSlice(filePath string) ([]string, error) {
	// 打开文件
	f, err := os.Open(filePath)
	if err != nil {
		return nil, err
	}
	// 自动关闭
	defer func() {
		_ = f.Close()
	} ()
	// 返回结果
	result := make([]string, 0)
	// 按行扫描
	scan := bufio.NewScanner(f)
	// 按行扫描
	for scan.Scan() {
		strId := scan.Text()
		if len(strId) < 1 {
			continue
		}
		result = append(result, scan.Text())
	}
	// 扫描完成
	return result, scan.Err()
}

// 读取文件内容，按行拆分为 int64 数组
func GBFileReadAndSplitLineAsInt64Slice(filePath string) ([]int64, error) {
	// 打开文件
	f, err := os.Open(filePath)
	if err != nil {
		return nil, err
	}
	// 自动关闭
	defer func() {
		_ = f.Close()
	} ()
	// 返回结果
	result := make([]int64, 0)
	// 按行扫描
	scan := bufio.NewScanner(f)
	// 按行扫描
	for scan.Scan() {
		strId := scan.Text()
		if len(strId) < 1 {
			continue
		}
		id, _ := strconv.ParseInt(scan.Text(), 10, 64)
		result = append(result, id)
	}
	// 扫描完成
	return result, scan.Err()
}
